package ophiux.wechatpay.sdk.request;

import java.util.HashMap;
import java.util.Map;

import ophiux.wechatpay.sdk.response.RefundResponse;

/**
 * 申请退款   请求参数
 * <br/>请求地址:https://api.mch.weixin.qq.com/secapi/pay/refund   需要证书  否则不能退款
 * <br/><h1>创建人: hehailong</h1><br/>
 * 创建时间：2017-7-7下午3:29:05<br/>
 * 修改记录1：
 */
public class RefundRequest extends OphiuxBaseRequest<RefundResponse>{
	//退款资金来源
    /** 未结算资金退款（默认使用未结算资金退款）  */
    public static final String REFUND_ACCOUNT_REFUND_SOURCE_UNSETTLED_FUNDS="REFUND_SOURCE_UNSETTLED_FUNDS";
    /** 可用余额退款  */
    public static final String REFUND_ACCOUNT_REFUND_SOURCE_RECHARGE_FUNDS="REFUND_SOURCE_RECHARGE_FUNDS";

	//字段名	变量名	必填	类型	示例值	描述
	/** 随机字符串	nonce_str	是	String(32)	5K8264ILTKCH16CQ2502SI8ZNMTM67VS	随机字符串，不长于32位。推荐随机数生成算法  */
	private String nonce_str;
	/** 签名	sign	是	String(32)	C380BEC2BFD727A4B6845133519F3AD6	签名，详见签名生成算法 */
	private String sign;
	
	/**===========   二选一	==============*/
	/** 微信订单号	transaction_id	String(28)	1217752501201407033233368018	微信生成的订单号，在支付通知中有返回  */
	private String transaction_id;
	/** 商户订单号	out_trade_no	String(32)	1217752501201407033233368018	商户系统内部订单号，要求32个字符内，只能是数字、大小写字母_-|*@ ，且在同一个商户号下唯一。  */
	private String out_trade_no;
	/**===========   二选一	==============*/
	
	/** 商户退款单号	out_refund_no	是	String(64)	1217752501201407033233368018	商户系统内部的退款单号，商户系统内部唯一，只能是数字、大小写字母_-|*@ ，同一退款单号多次请求只退一笔。 */
	private String out_refund_no;
	/** 订单金额	total_fee	是	Int	100	订单总金额，单位为分，只能为整数，详见支付金额  */
	private int total_fee;
	/** 退款金额	refund_fee	是	Int	100	退款总金额，订单总金额，单位为分，只能为整数，详见支付金额  */
	private int refund_fee;
	/** 货币种类	refund_fee_type	否	String(8)	CNY	货币类型，符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型 */
	private String refund_fee_type;
	/** 退款原因	refund_desc	否	String(80)	商品已售完	若商户传入，会在下发给用户的退款消息中体现退款原因 */
	private String refund_desc;
	/** 退款资金来源	refund_account	否	String(30)	REFUND_SOURCE_RECHARGE_FUNDS   仅针对老资金流商户使用REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款（默认使用未结算资金退款） REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款  */
	private String refund_account;
		
	
	@Override
	public String getApiMethod() {
		return "POST";
	}

	@Override
	public String getApiVersion() {
		return null;
	}

	@Override
	public Map getTextParam() {
		Map<String, String>  map = new HashMap<String, String>();
		map.put("nonce_str", nonce_str);
		map.put("sign", sign);
		map.put("transaction_id", transaction_id);
		map.put("out_trade_no", out_trade_no);
		map.put("out_refund_no", out_refund_no);
		map.put("total_fee", total_fee+"");
		map.put("refund_fee", refund_fee+"");
		map.put("refund_fee_type", refund_fee_type);
		map.put("refund_desc", refund_desc);
		map.put("refund_account", refund_account);
		
		return map;
	}

	@Override
	public Class<RefundResponse> getResponseClass() {
		return RefundResponse.class;
	}

	public String getNonce_str() {
		return nonce_str;
	}

	public void setNonce_str(String nonce_str) {
		this.nonce_str = nonce_str;
	}

	public String getSign() {
		return sign;
	}

	public void setSign(String sign) {
		this.sign = sign;
	}

	public String getTransaction_id() {
		return transaction_id;
	}

	public void setTransaction_id(String transaction_id) {
		this.transaction_id = transaction_id;
	}

	public String getOut_trade_no() {
		return out_trade_no;
	}

	public void setOut_trade_no(String out_trade_no) {
		this.out_trade_no = out_trade_no;
	}

	public String getOut_refund_no() {
		return out_refund_no;
	}

	public void setOut_refund_no(String out_refund_no) {
		this.out_refund_no = out_refund_no;
	}

	public int getTotal_fee() {
		return total_fee;
	}

	public void setTotal_fee(int total_fee) {
		this.total_fee = total_fee;
	}

	public int getRefund_fee() {
		return refund_fee;
	}

	public void setRefund_fee(int refund_fee) {
		this.refund_fee = refund_fee;
	}

	public String getRefund_fee_type() {
		return refund_fee_type;
	}

	public void setRefund_fee_type(String refund_fee_type) {
		this.refund_fee_type = refund_fee_type;
	}

	public String getRefund_desc() {
		return refund_desc;
	}

	public void setRefund_desc(String refund_desc) {
		this.refund_desc = refund_desc;
	}

	public String getRefund_account() {
		return refund_account;
	}

	public void setRefund_account(String refund_account) {
		this.refund_account = refund_account;
	}

}
